﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Data.Linq.SqlClient;
namespace Systemet
{
    public partial class KundController
    {
        private Views.Kundkort kundkort;
        private SideViews.SideKundkort sideKundkort;
        private Technical.KundPercistance reg;
        private Technical.ProduktConnection pC;
        private SideViews.SideIntaktsBudgetering sIB;
        private Views.BudgeteringPerKund bPKMain;
        private Kundregister kund;
        private Domain.ProdukController prodControll;

        public Kundregister Validatekund(Dictionary<string, string> kundvalidering, bool Isnew)
        {
            kund = kundCreation(kundvalidering);
            kundkort = (Views.Kundkort)AccessController.Instance.MainView;
            reg = new Technical.KundPercistance();
            bool IsSuccefull = reg.SaveKund(kund, Isnew);

            if (!IsSuccefull)
            {
                kundkort.ErrorException();
                return null;
            }
            else
            {
                kundkort.MessageNewCustomer();
                return kund;
                //updateKundDGV(kund.kundkategori, kund.kundNamn, kund.kundID);
            }
        }

        private string kundIDCreation()
        {
            reg = new Technical.KundPercistance();
            IEnumerable<Kundregister> kunder = reg.getFiltreringskriterier();
            bool IsnewKundID = false;
            string kundID = "";
            while (!IsnewKundID)
            {
                IsnewKundID = true;
                Random rnd = new Random();
                int bokstavsSiffra = rnd.Next(0, 26);
                char bokstav = (char)('a' + bokstavsSiffra);
                int siffra = rnd.Next(100, 999);
                kundID = (bokstav + siffra.ToString()).ToUpper();
                foreach (Kundregister k in kunder)
                {
                    if (k.kundID.TrimEnd() == kundID.TrimEnd())
                    {
                        IsnewKundID = false;
                    }
                }
            }
            return kundID;
        }
        private Kundregister kundCreation(Dictionary<string, string> kundinfo)
        {
            kund = new Kundregister();
            if (kundinfo["kundId"] == "")
            {
                kund.kundID = kundIDCreation();
            }
            else
            {
                kund.kundID = kundinfo["kundId"];
            }
            kund.kundNamn = kundinfo["kundnamn"];
            kund.kundkategori = kundinfo["kundKategori"];
            kund.kontaktFnamn = kundinfo["kontFnamn"];
            kund.kontaktEnamn = kundinfo["kontEnamn"];
            kund.telefonnummer = kundinfo["kontaktTlf"];
            kund.email = kundinfo["kundMail"];
            kund.andratDatum = DateTime.Parse(kundinfo["andrad"]);
            kund.signatur = kundinfo["signerad"];

            return kund;
        }

        public IEnumerable<Kundregister> updateKundDGV(string kundkategori, string kundnamn, string kundid)
        {
            reg = new Technical.KundPercistance();
            kundkort = (Views.Kundkort)AccessController.Instance.MainView;
            return reg.GetKund(kundkategori, kundnamn, kundid);
        }

        public IEnumerable<Kundregister> RetrieveCustomers()
        {
            reg = new Technical.KundPercistance();
            IEnumerable<Kundregister> customers = reg.getFiltreringskriterier();
            return customers;
        }

        public void UpdateCustomer()
        {
            sideKundkort = (SideViews.SideKundkort)AccessController.Instance.SidMeny;
            sideKundkort.updateComboboxes();
        }

        //Metoder För intäktsbudgetering på KUND
        public IEnumerable<Kundregister> RetrieveCustomersOnBudget(string kundOmrade)
        {
            reg = new Technical.KundPercistance();
            IEnumerable<Kundregister> kundnamn = reg.RetrieveCustomersOnBudgets(kundOmrade);
            return kundnamn;
        }

        public void ShowCurrentCustomer(string kundID, string kundnamn)
        {
            bPKMain = (Views.BudgeteringPerKund)AccessController.Instance.MainView;
            bPKMain.getCurrentCustomer(kundnamn, kundID);
        }

        public IEnumerable<Produktregister> UpdateCustomerBudgetDGV(string kundid, string produkt, string prodkategori, string gradA, string gradT)
        {
            bPKMain = (Views.BudgeteringPerKund)AccessController.Instance.MainView;
            reg = new Technical.KundPercistance();
            bPKMain.UpdateMainDgv(reg.RetrieveAllCustomerBudgets(kundid, produkt, prodkategori, gradA, gradT));
            return reg.RetrieveFilterBudgets(kundid);
        }

        public void UpdateSideIntäktsBudgeteringCustomers(string kundid)
        {
            sIB = (SideViews.SideIntaktsBudgetering)AccessController.Instance.SidMeny;
            reg = new Technical.KundPercistance();

            sIB.UpdateCustomerList(reg.RetrieveFilterBudgets(kundid));
        }

        //Returnerar en lista av produkter som budgeterats på en kund
        public IEnumerable<Produktregister> ProductsBudgetedOnCustomer(string kundid)
        {
            reg = new Technical.KundPercistance();
            return reg.RetrieveFilterBudgets(kundid);
        }

        //Validering av Intäktsbudget
        public bool BudgetValidation(string avtal, string tillagg, string gradA, string gradT, string tim, string prodId, string prodNamn, string kundID, string kundNamn)
        {
            bool validated = true;
            int number;
            if (!Int32.TryParse(avtal, out number) || number < 1)
            {
                return false;
            }
            if (!Int32.TryParse(tillagg, out number))
            {
                return false;
            }

            if (!Int32.TryParse(tim, out number))
            {
                return false;
            }
            pC = new Technical.ProduktConnection();
            if (!pC.ValidateIfProductExists(prodId, prodNamn))
            {
                return false;
            }
            reg = new Technical.KundPercistance();
            if (!reg.ValidateIfCustomerExists(kundID, kundNamn))
            {
                return false;
            }

            return validated;
        }

        public bool CreateBudgetRow(string avtal, string tillagg, string gradA, string gradT, string tim, string kommentar, string prodId, string prodNamn, string kundid, int budgID, bool IsNewBudgetRow, bool TypeBudg)
        {
            bool IsBudgPerCust = TypeBudg;
            Intäktsbudgetregister newBudgetrow = new Intäktsbudgetregister();
            newBudgetrow.kundID = kundid;
            if (!IsNewBudgetRow)
            {
                newBudgetrow.intBudID = budgID;
            }
            newBudgetrow.avtal = int.Parse(avtal);
            newBudgetrow.tillagg = int.Parse(tillagg);
            newBudgetrow.gradA = gradA;
            newBudgetrow.gradT = gradT;
            newBudgetrow.tim = int.Parse(tim);
            newBudgetrow.signatur = AccessController.Instance.LoggedInUser.UserName;
            newBudgetrow.andratDatum = DateTime.Now;
            newBudgetrow.kommentar = kommentar;
            newBudgetrow.produktID = prodId;
            //newBudgetrow.ProduktNamn = prodNamn;
            if (IsNewBudgetRow)
            {
                MessageBox.Show("Ny budgeteringsrad tillagd.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Ändra till att göra detta i GUI, inte i Controller!
            }
            //Ej ny budgetrad utan endast uppdatering
            if (!IsNewBudgetRow)
            {
                reg = new Technical.KundPercistance();
                bool isSuccessfull = reg.UpdateCustomerBudgetRow(newBudgetrow);
                if (isSuccessfull)
                {
                    //Om det är en Uppdatering gjord från budget per kund
                    if (IsBudgPerCust)
                    {
                        MessageBox.Show("Budgeteringsrad ändrad.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        //Ändra till att göra detta i GUI, inte i Controller!
                        UpdateCustomerBudgetDGV(kundid, "", "", "", "");
                    }
                    else
                    {
                        MessageBox.Show("Budgeteringsrad ändrad.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        //Ändra till att göra detta i GUI, inte i Controller!
                        prodControll = new Domain.ProdukController();
                        prodControll.UpdateBudgetPerProduktDGV(prodId, prodNamn, "", "");
                    }
                }
                return isSuccessfull;
            }
            //Ny budgetrad 
            else if (IsNewBudgetRow)
            {
                reg = new Technical.KundPercistance();
                bool isSuccessfull = reg.InsertNewBudgetRow(newBudgetrow);

                if (isSuccessfull)
                {
                    //Om det är en Uppdatering gjord från budget per kund
                    if (IsBudgPerCust)
                    {
                        UpdateCustomerBudgetDGV(kundid, "", "", "", "");
                    }
                    else
                    {
                        prodControll = new Domain.ProdukController();
                        prodControll.UpdateBudgetPerProduktDGV(prodId, prodNamn, "", "");
                    }
                }
                return isSuccessfull;
            }
            return false;
        }

        public bool RemoveBudgetRow(int budgID)
        {
            reg = new Technical.KundPercistance();
            bool isSuccessfull = reg.RemoveBudgetFromCustomer(budgID);
            return isSuccessfull;
        }
        public void RemoveSumTb()
        {
            bPKMain = (Views.BudgeteringPerKund)AccessController.Instance.MainView;
            bPKMain.HideSum();
        }
    }
}
